10分钟学会Ruby
Ruby是一种动态的、面向对象的编程语言,以其优雅的语法和开发者友好的特性而闻名。本教程涵盖Ruby的核心概念,帮助你快速学习这门语言。
1. 编写第一个Ruby程序
让我们从一个简单的程序开始。创建一个名为hello.rb
的文件,输入以下代码:
puts "Hello, World!"
保存文件并在终端中运行以下命令:
ruby hello.rb
输出将是:
Hello, World!
这个简单的程序展示了Ruby的基本输出功能。puts
方法用于在控制台中显示文本信息。
2. 基本语法
Ruby的语法简洁易读,设计得自然直观。
# 这是一个注释
puts "Hello, World!"
Ruby中的基本语法规则:
- 注释:单行注释以
#
开头,多行注释使用=begin
和=end
。 - 语句:通常每行一个语句,末尾不需要分号
;
。 - 代码块:由
do...end
或花括号{}
定义。 - 方法调用:对于没有参数的方法调用,括号是可选的。
多行注释示例:
=begin
这是一个多行注释,
跨越多行。
=end
3. 变量和数据类型
在Ruby中,变量是动态类型的,不需要显式类型声明。
基本变量命名规则:
- 变量名只能包含字母、数字和下划线。
- 变量名不能以数字开头。
- 变量名区分大小写。
- Ruby关键字不能用作变量名。
Ruby的主要基本数据类型有:
- 整数(Integer):例如
42
或-10
。 - 浮点数(Float):例如
3.14
或2.5e3
。 - 字符串(String):例如
"hello"
或'world'
,使用单引号或双引号。 - 布尔值(Boolean):
true
或false
。 - Nil值(Nil):由
nil
表示,表示空或无值。 - 符号(Symbol):例如
:name
,不可变的标识符。
3.1 数值类型
Ruby支持整数和浮点数。
# 整数
age = 25
population = 1_000_000 # 使用下划线提高可读性
# 浮点数
temperature = 36.5
pi = 3.14159
# 运算
puts 10 + 5 # 15
puts 10 / 3 # 3(整数除法)
puts 10.0 / 3 # 3.333...(浮点数除法)
3.2 字符串
字符串是字符序列,用单引号或双引号括起来。
single_quote = '单引号字符串'
double_quote = "双引号字符串"
multiline = "这是一个
多行字符串"
# 字符串插值(仅在双引号中有效)
name = "Alice"
greeting = "Hello, #{name}!"
puts greeting # "Hello, Alice!"
字符串操作:
text = "Ruby编程"
puts text.length # 字符串长度
puts text.upcase # 转换为大写
puts text.downcase # 转换为小写
puts text[0] # 访问第一个字符
puts text[0..3] # 字符串切片
puts text.include?("Ruby") # 检查是否包含
3.3 布尔类型
布尔类型有两个值:true
和false
。
is_active = true
is_complete = false
# 布尔运算
result1 = true && false # false
result2 = true || false # true
result3 = !true # false
3.4 Nil类型
nil
表示空或无值的状态。
value = nil
if value.nil?
puts "值为空"
end
3.5 符号
符号是不可变的标识符,通常用作哈希中的键。
:name
:email
:created_at
# 符号与字符串的比较
puts :name.object_id == :name.object_id # true(相同对象)
puts "name".object_id == "name".object_id # false(不同对象)
4. 数据结构
Ruby提供了几种内置的数据结构来存储和操作数据。
4.1 数组
数组是一个有序集合,可以容纳多个值。
numbers = [1, 2, 3, 4, 5]
numbers.push(6) # 添加元素
numbers.unshift(0) # 在开头插入
numbers.delete(3) # 删除特定值
numbers[0] = 10 # 修改元素
puts numbers.inspect # [10, 2, 4, 5, 6]
数组操作:
numbers = [10, 20, 30, 40, 50]
puts numbers[1..3] # [20, 30, 40]
puts numbers.first # 10
puts numbers.last # 50
puts numbers.include?(30) # true
4.2 哈希
哈希是键值对的集合,类似于其他语言中的字典。
student = {
name: "John",
age: 20,
major: "Computer Science"
}
# 访问和修改哈希
puts student[:name]
student[:age] = 21
student[:gpa] = 3.8
# 遍历哈希
student.each do |key, value|
puts "#{key}: #{value}"
end
5. 控制流
Ruby提供了几种控制流语句来管理程序执行。
5.1 if语句
if
语句评估条件,如果条件为真则执行其代码块。
age = 20
if age >= 18
puts "成年人"
elsif age >= 13
puts "青少年"
else
puts "儿童"
end
# 单行if
puts "成年人" if age >= 18
5.2 unless语句
unless
与if
相反 - 当条件为假时执行。
age = 15
unless age >= 18
puts "不是成年人"
end
# 单行unless
puts "不是成年人" unless age >= 18
5.3 case语句
case
语句提供了一种处理多个条件的简洁方式。
grade = "B"
case grade
when "A"
puts "优秀"
when "B"
puts "良好"
when "C"
puts "一般"
else
puts "需要改进"
end
5.4 循环
Ruby支持各种循环结构。
while循环:
count = 0
while count < 5
puts count
count += 1
end
until循环:
count = 0
until count >= 5
puts count
count += 1
end
for循环:
for i in 0..4
puts i
end
each迭代器:
(0..4).each do |i|
puts i
end
# 使用数组
fruits = ["apple", "banana", "cherry"]
fruits.each do |fruit|
puts fruit
end
break和next:
(0..9).each do |i|
break if i == 5 # 退出循环
next if i % 2 == 0 # 跳过偶数
puts i # 输出:1, 3
end
6. 方法
Ruby中的方法使用def
关键字定义。
基本方法定义:
def greet(name)
"Hello, #{name}!"
end
# 调用方法
message = greet("John")
puts message
默认参数:
def greet(name, greeting = "Hello")
"#{greeting}, #{name}!"
end
puts greet("Alice") # "Hello, Alice!"
puts greet("Bob", "Hi") # "Hi, Bob!"
可变参数:
def sum_numbers(*numbers)
numbers.sum
end
puts sum_numbers(1, 2, 3, 4) # 10
关键字参数:
def create_person(name:, age:, city: "Unknown")
{ name: name, age: age, city: city }
end
person = create_person(name: "Alice", age: 25)
puts person.inspect
7. 块和Procs
块是可以传递给方法的代码块。
使用块:
# 使用 do...end
3.times do
puts "Hello!"
end
# 使用花括号
3.times { puts "Hello!" }
# 带参数的块
(1..3).each do |number|
puts "Number: #{number}"
end
Yield关键字:
def run_block
puts "块之前"
yield
puts "块之后"
end
run_block { puts "块内部" }
Procs:
Procs是封装块的对象。
square = Proc.new { |x| x * x }
puts square.call(5) # 25
# 将procs传递给方法
def apply_operation(numbers, operation)
numbers.map { |n| operation.call(n) }
end
numbers = [1, 2, 3, 4]
squares = apply_operation(numbers, square)
puts squares.inspect # [1, 4, 9, 16]
8. 类和对象
Ruby是一种纯面向对象语言,所有东西都是对象。
基本类定义:
class Person
def initialize(name, age)
@name = name
@age = age
end
def introduce
"我是#{@name},#{@age}岁"
end
def have_birthday
@age += 1
"#{@name}过生日了,现在#{@age}岁"
end
end
# 创建对象
person1 = Person.new("John", 25)
person2 = Person.new("Jane", 30)
puts person1.introduce
puts person2.have_birthday
访问器方法:
class Person
attr_reader :name # 读取访问
attr_writer :age # 写入访问
attr_accessor :city # 读写访问
def initialize(name, age, city)
@name = name
@age = age
@city = city
end
end
person = Person.new("Alice", 25, "New York")
puts person.name # "Alice"
person.age = 26 # 设置年龄
person.city = "Boston" # 设置城市
puts person.city # "Boston"
类方法和变量:
class Student
@@student_count = 0 # 类变量
def initialize(name)
@name = name
@@student_count += 1
end
def self.student_count # 类方法
@@student_count
end
end
student1 = Student.new("John")
student2 = Student.new("Jane")
puts Student.student_count # 2
继承:
class Animal
def initialize(name)
@name = name
end
def speak
"#{@name}发出声音"
end
end
class Dog < Animal
def speak
"#{@name}汪汪叫"
end
end
class Cat < Animal
def speak
"#{@name}喵喵叫"
end
end
dog = Dog.new("Buddy")
cat = Cat.new("Mimi")
puts dog.speak # "Buddy汪汪叫"
puts cat.speak # "Mimi喵喵叫"
9. 模块和Mixins
模块用于分组相关的方法和常量,可以混入类中。
模块定义:
module Speakable
def speak
"#{@name}说了些什么"
end
end
class Person
include Speakable
def initialize(name)
@name = name
end
end
person = Person.new("Alice")
puts person.speak # "Alice说了些什么"
使用模块命名空间:
module Math
PI = 3.14159
def self.square(x)
x * x
end
end
puts Math::PI # 3.14159
puts Math.square(5) # 25
10. 异常处理
Ruby使用begin
、rescue
、ensure
和raise
提供了强大的异常处理功能。
基本异常处理:
begin
result = 10 / 0
rescue ZeroDivisionError => e
puts "不能除以零:#{e.message}"
else
puts "除法成功"
ensure
puts "这总是会运行"
end
抛出异常:
def divide(a, b)
raise "不能除以零" if b == 0
a / b
end
begin
result = divide(10, 0)
rescue => e
puts "错误:#{e.message}"
end
11. 文件操作
Ruby提供了简单的方法来读写文件。
读取文件:
# 读取整个文件
content = File.read("example.txt")
puts content
# 逐行读取
File.foreach("example.txt") do |line|
puts line.chomp
end
写入文件:
# 写入文件
File.write("output.txt", "Hello, Ruby!\n")
# 追加到文件
File.open("output.txt", "a") do |file|
file.puts "追加新内容。"
end
12. 有用的内置方法
Ruby自带许多有用的内置方法。
字符串方法:
text = " Ruby编程 "
puts text.strip # 移除空白
puts text.split(" ") # 分割成数组
puts text.gsub("Ruby", "Python") # 替换
数组方法:
numbers = [3, 1, 4, 1, 5, 9, 2]
puts numbers.sort.inspect # [1, 1, 2, 3, 4, 5, 9]
puts numbers.uniq.inspect # [3, 1, 4, 5, 9, 2]
puts numbers.select { |n| n > 3 }.inspect # [4, 5, 9]
哈希方法:
person = { name: "Alice", age: 25, city: "New York" }
puts person.keys.inspect # [:name, :age, :city]
puts person.values.inspect # ["Alice", 25, "New York"]
puts person.has_key?(:age) # true
13. Ruby Gems
RubyGems是Ruby的包管理器,用于安装和管理库。
安装Gems:
gem install rails
在代码中使用Gems:
require 'json'
# 解析JSON
json_string = '{"name": "Alice", "age": 25}'
person = JSON.parse(json_string)
puts person["name"] # "Alice"
# 生成JSON
person_hash = { name: "Bob", age: 30 }
json_output = JSON.generate(person_hash)
puts json_output # {"name":"Bob","age":30}
14. Ruby风格指南
Ruby有一个强大的社区风格指南,提倡编写干净、可读的代码。
缩进:使用2个空格进行缩进。
命名约定:
- 变量和方法:
snake_case
- 类和模块:
CamelCase
- 常量:
SCREAMING_SNAKE_CASE
括号:对于带参数的方法调用使用括号,对于不带参数的方法调用省略括号。
代码块:对于多行代码块使用do...end
,对于单行代码块使用{}
。
Ruby优雅的语法和强大的特性使其使用起来非常愉快。它关注开发者的幸福感和生产力,使其在Web开发、脚本编写和自动化任务中广受欢迎。